//
//  SudokuUtil.m
//  Sudoku
//
//  Created by iMac-hxsd on 12-2-7.
//  Copyright 2012年 __MyCompanyName__. All rights reserved.
//

#import "SudokuUtil.h"
#import "Constant.h"

@implementation SudokuUtil

// 生成数独数组字典
+ (NSDictionary *) makeSudoku 
{
    NSMutableDictionary *sudokuTable = [[NSMutableDictionary alloc] initWithCapacity:kSudokuButtonNumber];
    // 初始化数独数组
    sudokuTable = [SudokuUtil initSudokuTable];
    
    // 初始化数值 循环次数
    int loop = 0;
    int rowLoop = 0;
    
    while (loop <10) 
	{;
        for (int i = 1; i <= 9 && rowLoop <= 50; i ++) 
        {
            for (int j = 1; j <= 9 ; j++) 
			{
                // 获取单元格内的可能的值
                NSArray *posibleValue = [[SudokuUtil getCellPosibleValue:sudokuTable atRow:i atCol:j] allKeysForObject:@"YES"];
                // 如果不存在可能值 
                if ([posibleValue count] == 0) 
				{
                    for (int k = 1; k < j; k++) 
					{
                        // 将值设为0
                        [sudokuTable setValue:@"0" forKey:[NSString stringWithFormat:@"%d%d",i,k]];
                    }
                    rowLoop ++;
                    i--;
                    break;
                }
                int randomID = 0;
                
                // 如果存在可能值
                if ([posibleValue count] > 1) 
                {
                    // 从可能值数组范围内生成一个随机数
                    randomID = (arc4random() % [posibleValue count]);
                }
                // 从可能值数组中获取随机的一个值，并转换为整型
                int random = [[posibleValue objectAtIndex:randomID] intValue];
                // 单元格的位置
                NSString *rowcol = [NSString stringWithFormat:@"%d%d",i,j];
                // 存入字典，下标为单元格的位置
                [sudokuTable setValue:[NSString stringWithFormat:@"%d",random] forKey:rowcol];
            }
            
        }
        
        // 行循环次数清0
        rowLoop = 0;
		
        // 如果数独字典填充完毕，跳出循环
        if ([SudokuUtil isSudokuTableFullFilled:sudokuTable]) 
		{
            break;
        }
        
        loop ++;
    }
	
	//NSLog(@"sudokuTable == %@", sudokuTable);
    return sudokuTable;
}

// 初始化数独数组
+ (NSMutableDictionary *) initSudokuTable
{
    NSMutableDictionary *sudokuTable = [[NSMutableDictionary alloc] initWithCapacity:kSudokuButtonNumber];
    // 生成一个长度为81，下标从11到99的数组，
    for (int i = 1; i <= 9; i++) 
	{
        for (int j = 1; j <= 9; j++) 
		{
            [sudokuTable setValue:@"0" forKey:[NSString stringWithFormat:@"%d%d",i,j]];
        }
    }
    return sudokuTable;
}

// 获取某个单元格可能的值 
+ (NSMutableDictionary *) getCellPosibleValue : (NSDictionary *) sudokuTable atRow : (int) row atCol : (int) col 
{
    // 初始化可能值数量
    int posibleValueCount = 0;
    // 初始化数组，长度为9
    NSMutableDictionary *posibleValues = [[NSMutableDictionary alloc] initWithCapacity:9];
    // 给可能数值数组赋值为YES，表示1-9都可能出现
    for (int i = 1; i <= 9; i++) 
	{
        [posibleValues setValue:@"YES" forKey:[NSString stringWithFormat:@"%d",i]];
    }
	
    // Row & Col
    for (int i = 1; i <= 9; i++) 
	{
        // 当前行上的值
        NSString *nowValueRow = [sudokuTable valueForKey:[NSString stringWithFormat:@"%d%d",row,i]];
        // 当前列上的值 
        NSString *nowValueCol = [sudokuTable valueForKey:[NSString stringWithFormat:@"%d%d",i,col]];
        // 如果当前列的值不为0或不为空，将当前列上的值标记为不可能出现值
        if (nowValueCol != @"0" && nowValueCol != nil) 
        {
            [posibleValues setValue:@"NO" forKey:nowValueCol];
        }
        // 如果当前行的值不为0或不为空，将当前行上的值标记为不可能出现值
        if (nowValueRow != @"0" && nowValueRow != nil)
        {
            [posibleValues setValue:@"NO" forKey:nowValueRow];
        }    
    }
    
    // 区域检查
    // 11,12,13
    // 21,22,23
    // 31,32,33
    // 这表示一个区域
    // 获取区域的起始行
    int areaRow = [SudokuUtil getSudokuAreaStartPos:row];
    // 获取区域的起始列
    int areaCol = [SudokuUtil getSudokuAreaStartPos:col];
    // 循环这9个位置
    for (int i = areaRow; i < areaRow + 3 ; i++) 
	{
        for (int j = areaCol; j < areaCol + 3; j++) 
		{
            // 获取当前单元格的值
            NSString *nowValue = [sudokuTable valueForKey:[NSString stringWithFormat:@"%d%d",i,j]];
            if (nowValue !=@"0" && nowValue != nil) 
            {
                // 如果当前单元格的值不为0或不为空，将当前单元格上的值标记为不可能出现值
                [posibleValues setValue:@"NO" forKey:nowValue];
            }
        }
    }
    
    // 再次循环可能值数组
    for (int i = 1; i <= 9; i++) 
	{
        // 如果还存在值为YES，将可能值数量加1
        if ([[posibleValues valueForKey:[NSString stringWithFormat:@"%d",i]] boolValue]) 
		{
            posibleValueCount ++;
        }
    }
    
    return posibleValues;
}

// 获取区域初始位置
+ (int) getSudokuAreaStartPos : (int) pos 
{
    int areaPos = 0;
    int startPos = pos % 3;
    switch (startPos) {
        case 1:
            areaPos = pos;
            break;
        case 2:
            areaPos = pos - 1;
            break;
        case 0:
            areaPos = pos - 2;
            break;
        default:
            break;
    }
    return areaPos;
}

// 判断数独数组是否全部填充完毕（无0值）
+ (BOOL) isSudokuTableFullFilled : (NSDictionary *) sudokuTable 
{
    if ([[sudokuTable allKeysForObject:@"0"] count] == 0) 
	{
        return YES;
    }
    else 
	{
		return NO;
	}
}

// 判断游戏是否结束（无空值）
+ (BOOL) isSudokuGameComplete:(NSDictionary *) sudokuTable
{
    if ([[sudokuTable allKeysForObject:@" "] count] == 0) 
	{
        return YES;
    }
    else 
	{
		return NO;
	}
}

// 在视图中创建数独按钮
+ (UIButton *) createSudokuButtonForView : (UIViewController *) view atPos : (CGRect) position withTag : (int) tag forAction : (SEL) action 
{
    UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
    [b setFrame:position];
    [b.titleLabel setFont:[UIFont boldSystemFontOfSize:15]];
    [b setTag:tag];
    [b addTarget:view action:action forControlEvents:UIControlEventTouchDown];
    [b setTitle:@"" forState:0];
    [b setTitleColor:[UIColor blackColor] forState:0];
    b.userInteractionEnabled = YES;
    return b;
}

// 设置空单元格
+ (NSMutableDictionary *) makeEmptyCell : (NSDictionary *) sudokuResource forLevel : (int) level 
{
    int notEmptyCell = kSudokuButtonNumber;
    NSMutableDictionary *sudokuTable = [[NSMutableDictionary alloc] initWithDictionary:sudokuResource copyItems:YES];
    while (notEmptyCell > level) 
	{
        int row = (arc4random() % 9) + 1;
        int col = (arc4random() % 9) + 1;
        NSString *rowcol = [NSString stringWithFormat:@"%d%d",row,col];
        if ([[sudokuTable valueForKey:rowcol] intValue] > 0) 
		{
            [sudokuTable setValue:@" " forKey:rowcol];
            notEmptyCell --;
        }
    }
    return sudokuTable;
}

// 根据位置获取数独表格背景图片
+ (NSString *) sudokuButtonBg : (int) x y : (int) y
{
	NSString *n1 = @"";
	NSString *n2 = @"";
	
	// 第一列
	if (y % 3 == 1) 
	{
		n1 = @"left";
	}
	// 第三列
	else if (y % 3 == 0) 
	{
		n1 = @"right";
	}
	
	// 第一行
	if (x % 3 == 1) 
	{
		n2 = @"top";
	}
	// 第三行
	else if (x % 3 == 0) 
	{
		n2 = @"bottom";
	}
	
	NSString *picName = @"";
	if(y % 3 == 2 && x % 3== 2)
	{
		picName = @"buttonbg.png";
	}
	else
	{
		picName = [NSString stringWithFormat:@"button%@%@.png", n1, n2];
	}
	
	return picName;
}

@end

